package com.ctshk.rpc.hotel.service;

import com.ctshk.common.dto.Result;
import com.ctshk.common.model.PageResponse;
import com.ctshk.common.model.TokenUser;
import com.ctshk.rpc.hotel.dto.*;
import com.ctshk.rpc.hotel.dto.booking.HotelProductUnitPriceDTO;
import com.ctshk.rpc.hotel.req.*;
import com.ctshk.rpc.hotel.req.booking.HotelProductUnitPriceReq;

import java.time.LocalDate;
import java.util.List;

/**
 * <p>
 * 酒店产品 服务类
 * </p>
 *
 * @author yinhuan
 * @since 2021-03-03
 */
public interface IHotelProductService {

    /**
     * 查询酒店产品列表
     * @param req
     * @return
     */
    PageResponse<HotelProductListDTO> queryList(HotelListProductReq req, long userId);

    /**
     * 新增酒店产品信息
     * @param hotelProductDataReq
     * @param user
     */
    Result saveHotelProduct(HotelProductDataReq hotelProductDataReq, TokenUser user);

    /**
     * 新增酒店产品预订信息
     * @param hotelProductReq
     * @param user
     */
    Result saveHotelResevertionProduct(HotelProductReq hotelProductReq, TokenUser user);

    /**
     * 酒店产品详情
     * @param id
     * @return
     */
    HotelProductDTO  queryDetail(Long id);

    /**
     * 酒店产品预订设置修改
     * @param hotelProductDataReq
     * @return
     */
    Result updateReservation(HotelProductDataReq hotelProductDataReq, TokenUser user);

    /**
     * 酒店产品预订设置修改
     * @param id
     * @param tokenUser
     * @return
     */
    Result setValid(Long id, TokenUser tokenUser);

    /**
     * 修改酒店产品
     * @param hotelProductDataReq
     * @return
     */
    Result updateHotelProduct(HotelProductDataReq hotelProductDataReq, TokenUser user);

    /**
     * 批量设置酒店产品
     * @param batchHotelProductInfoReq
     * @return
     */
    Result batchSettingHotel(BatchHotelProductInfoReq batchHotelProductInfoReq, TokenUser user);

    /**
     * api设置
     * @param hotelProductSetReq
     */
    Result setApi(HotelProductSetReq hotelProductSetReq, TokenUser user);

    /**
     * 推荐设置
     * @param hotelRecommendedReq
     */
    Result setRecommended(HotelRecommendedReq hotelRecommendedReq, TokenUser user);

    /**
     * 根据酒店品牌ID查询酒店
     * @param hotelNameAndIdReq
     */
    List<HotelNameInfoDTO> getHotelInfoByBrand(HotelNameAndIdReq hotelNameAndIdReq);

    /**
     * 根据酒店ID查询酒店房型
     * @param hotelNameAndIdReq
     */
    List<HotelNameInfoDTO> getHotelRoomNameInfo(HotelNameAndIdReq hotelNameAndIdReq);

    /**
     * 根据酒店ID查询酒店房型
     * @param userId
     */
    List<RecommendedHotelDTO> queryRecommendedHotel(Long userId);

    /**
     * 新增-编辑提交审批
     * @param id
     * @return
     */
    Result submit(Long id, TokenUser user);

    /**
     * 修改审核通过巴士产品
     */
    Result updateApprovedHotelProduct(HotelProductReq hotelProductReq, TokenUser user);



    /**
     * 修改审核不通过巴士产品
     */
    Result updateUnapprovedHotelProduct(HotelProductReq hotelProductReq, TokenUser user);

    /**
     * 产品预订-查询酒店产品详情
     * @param hotelId
     * @return
     */
    HotelReservestionStockAndPriceDTO bookingHotel(Long hotelId,TokenUser user);

    /**
     * 根据产品ID和日期返回产品日期内加幅设置后的价格
     * @param getHotelPriceReq
     * @return
     */
    Result getHotelProductPrice(GetHotelPriceReq getHotelPriceReq);

    /**
     * 酒店预订查询
     * @param req
     * @return
     */
    PageResponse<RecommendedHotelDTO> queryReservetionList(HotelReservertionReq req);

    /**
     * 根据酒店产品id和用户id，查询用户自营下的加幅后价格和余票信息,售出数量增加
     *
     * @param hotelIncreaseStrategyPriceQueryReq
     * @return
     */
    HotelPriceRemainderDTO selectSelfPriceRemainderAndLock(HotelIncreaseStrategyPriceQueryReq hotelIncreaseStrategyPriceQueryReq);

    /**
     *
     * @param id
     * @return
     */
    HotelProductInfoDTO selectInfo(Long id);

    /**
     *  根据id获取酒店产品 - 不校验是否存在
     * @param id
     * @return
     */
    HotelProductInfoDTO selectById(Long id);

    /**
     * 根据下单人类型查询指定时间的产品单价
     * @param req
     * @param userId
     * @return
     */
    Result<HotelProductUnitPriceDTO> queryUnitPrice(HotelProductUnitPriceReq req, Long userId);

    /**
     * 酒店产品发起审批
     * @param productId
     * @param userId
     * @return
     */
    Long approvalStart(long productId, long userId);

    /**
     * 酒店产品审核审批
     * @param approvalId
     * @param userId
     * @return
     */
    Long approvalCheck(long approvalId, long businessId, long userId, int status, String comments);

    /**
     * 查询酒店产品售价与库存 - 提供给内部套票的api - TODO 待实现
     * @param strategyType  加幅类型，1：自营；2：代理；3：官方平台；4：第三方平台；
     * @param productId     产品ID
     * @param checkInDate   入住日期
     * @param checkOutDate  离店日期
     * @param roomNum       房间数
     * @param relId         关联ID，strategyType(1：用户ID；2：代理ID；3：渠道ID；4：渠道ID)
     * @return
     */
    Result<HotelStockDTO> findHotelSalePriceInfoHandle(int strategyType, long productId, LocalDate checkInDate, LocalDate checkOutDate, int roomNum, long relId);
}
